Use a FIFO list for storing GdkSelProp of a single window so that
authorIvan, Wong Yat Cheung <email@ivanwong.info>
Wed, 2 Feb 2005 17:31:47 +0000 (17:31 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Wed, 2 Feb 2005 17:31:47 +0000 (17:31 +0000)
2005-02-02  Ivan, Wong Yat Cheung  <email@ivanwong.info>

* gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp
of a single window so that gtk_clipboard_request_contents() can be
called inside a GtkClipboardReceivedFunc(). (#163844)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gdk/win32/gdkselection-win32.c

index 601dda3d8e60cbbce93f5b67116d41f63c58e220..04f5c86a73f36c71f3260de9d3c5039c9e539fa2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-02-02  Ivan, Wong Yat Cheung  <email@ivanwong.info>
+
+       * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp
+       of a single window so that gtk_clipboard_request_contents() can be
+       called inside a GtkClipboardReceivedFunc(). (#163844)
+
 2005-02-01  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkicontheme.c (gtk_icon_theme_init): Look for icons
index 601dda3d8e60cbbce93f5b67116d41f63c58e220..04f5c86a73f36c71f3260de9d3c5039c9e539fa2 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-02  Ivan, Wong Yat Cheung  <email@ivanwong.info>
+
+       * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp
+       of a single window so that gtk_clipboard_request_contents() can be
+       called inside a GtkClipboardReceivedFunc(). (#163844)
+
 2005-02-01  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkicontheme.c (gtk_icon_theme_init): Look for icons
index 601dda3d8e60cbbce93f5b67116d41f63c58e220..04f5c86a73f36c71f3260de9d3c5039c9e539fa2 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-02  Ivan, Wong Yat Cheung  <email@ivanwong.info>
+
+       * gdk/win32/gdkselection.c: Use a FIFO list for storing GdkSelProp
+       of a single window so that gtk_clipboard_request_contents() can be
+       called inside a GtkClipboardReceivedFunc(). (#163844)
+
 2005-02-01  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkicontheme.c (gtk_icon_theme_init): Look for icons
index aaf728376ee6a3217848762de03dd24e1e95634d..3b23bcdbf34ac07f0860b8e220820860229948c3 100644 (file)
@@ -136,13 +136,8 @@ _gdk_selection_property_store (GdkWindow *owner,
                                gint       length)
 {
   GdkSelProp *prop;
+  GSList *prop_list;
 
-  prop = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (owner));
-  if (prop != NULL)
-    {
-      g_free (prop->data);
-      g_hash_table_remove (sel_prop_table, GDK_WINDOW_HWND (owner));
-    }
   prop = g_new (GdkSelProp, 1);
 
   if (type == GDK_TARGET_STRING)
@@ -167,7 +162,9 @@ _gdk_selection_property_store (GdkWindow *owner,
     }
   prop->format = format;
   prop->type = type;
-  g_hash_table_insert (sel_prop_table, GDK_WINDOW_HWND (owner), prop);
+  prop_list = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (owner));
+  prop_list = g_slist_append (prop_list, prop);
+  g_hash_table_insert (sel_prop_table, GDK_WINDOW_HWND (owner), prop_list);
 }
 
 void
@@ -656,6 +653,7 @@ gdk_selection_property_get (GdkWindow  *requestor,
                            gint       *ret_format)
 {
   GdkSelProp *prop;
+  GSList *prop_list;
 
   g_return_val_if_fail (requestor != NULL, 0);
   g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0);
@@ -666,7 +664,8 @@ gdk_selection_property_get (GdkWindow  *requestor,
   GDK_NOTE (DND, g_print ("gdk_selection_property_get: %p\n",
                           GDK_WINDOW_HWND (requestor)));
 
-  prop = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (requestor));
+  prop_list = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (requestor));
+  prop = prop_list ? (GdkSelProp *) prop_list->data : NULL;
 
   if (prop == NULL)
     {
@@ -691,15 +690,18 @@ void
 _gdk_selection_property_delete (GdkWindow *window)
 {
   GdkSelProp *prop;
+  GSList *prop_list;
   
   GDK_NOTE (DND, g_print ("_gdk_selection_property_delete: %p\n",
                           GDK_WINDOW_HWND (window)));
 
-  prop = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (window));
-  if (prop != NULL)
+  prop_list = g_hash_table_lookup (sel_prop_table, GDK_WINDOW_HWND (window));
+  if (prop_list && (prop = (GdkSelProp *) prop_list->data) != NULL)
     {
       g_free (prop->data);
-      g_hash_table_remove (sel_prop_table, GDK_WINDOW_HWND (window));
+      prop_list = g_slist_remove (prop_list, prop);
+      g_free (prop);
+      g_hash_table_insert (sel_prop_table, GDK_WINDOW_HWND (window), prop_list);
     }
 }